EC2でサーバーに負荷を発生させる stress ツールを使ってみる
はじめに
こんにちは植木和樹です。Amazon Linux AMI 2014.09がリリースされて随分と経ちましたが、リリースノートにちょっと目を引いた記載がありました。
New packages In addition to the features above, here are some other new packages added based on customer requests: : stress-1.0.4 :
stressというのはCPUやメモリーの負荷を発生させるツールです。サーバーの高負荷状態でのアプリケーション挙動を確認する際に使用します。便利なツールなので使い方をおさらいしてみました。
stressの使い方
プロジェクトページ
stressツールのプロジェクトページはこちらです。
インストール
インストールはyumで簡単にインストールできます。設定ファイルの作成等も不要です。
$ sudo yum install stress -y $ stress --version stress 1.0.4
manページ
stressの詳しい使い方はmanページをご覧ください。以下の説明ではmanページの内容を掲載しています。
$ man stress
CPU(ユーザー)に負荷をかける
アプリケーションレベルでCPU高負荷状態にしたい場合に指定します。
stress -c spawn N workers spinning on sqrt()
以下のコマンドで1つのプロセスがひたすらsqrtを実行してCPU使用率(ユーザー)を高くしてくれます。
$ stress -c 1
CPU(システム)に負荷をかける
システムコールやカーネルスレッドレベルでCPU高負荷状態にしたい場合に指定します。
stress -i spawn N workers spinning on sync()
以下のコマンドで1つのプロセスがひたすらsync(キャッシュをディスクに書き込む)を実行してCPU使用率(システム)を高くしてくれます。ただCPU(システム)が単独で高負荷になる状態というのはあまり経験がないです(メモリーが不足してスワップしていることで高くなっているケースが多い)。
$ stress -i 1
メモリーを消費する
メモリーを大量に消費したい場合に指定します。デフォルトではワーカー1つにつき、256MBのメモリーを確保しますが--vm-bytesで指定可能です。
stress -m spawn N workers spinning on malloc()/free() --vm-bytes B malloc B bytes per vm worker (default is 256MB)
以下のコマンドで4つのプロセスが512MBずつメモリーを確保しては解放します。
$ stress -m 4 --vm-bytes 512M
ディスクIOに負荷をかける
ディスクIO待ちにしたい場合に指定します。デフォルトではワーカー1つにつき、1GBの書き込みを行いますが--hdd-bytesで指定可能です。
stress -d spawn N workers spinning on write()/unlink() --hdd-bytes B write B bytes per hdd worker (default is 1GB)
以下のコマンドで2つのプロセスが2GBずつディスクへの書き込みを行います。topやvmstatのCPU(Wait)を高い状態にします。
$ stress -d 2 --hdd-bytes 2G
CPUに負荷をかけてみる
試しにt2.microのインスタンスでワーカーを1つだけ起動してCPUに負荷をかけてみました。
stressを実行した状態で、別のsshセッションからvmstatを実行してみます。CPUに負荷がかかり始めると、一番左のprocs - r(Running processes) が1になり、cpuのus(CPU USer)が100%になることが分かります。代わりにcpu id(CPU IDle)はゼロになっていますね。
$ stress -c 1 stress: info: [22269] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
$ vmstat -t 1 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp--- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 531464 14980 408656 0 0 0 0 7 11 0 0 100 0 0 2014-11-01 04:22:26 UTC 0 0 0 531464 14980 408656 0 0 0 0 8 10 0 0 100 0 0 2014-11-01 04:22:27 UTC 1 0 0 531324 14980 408656 0 0 0 0 94 39 30 0 70 0 0 2014-11-01 04:22:28 UTC 1 0 0 531324 14980 408656 0 0 0 0 253 19 100 0 0 0 0 2014-11-01 04:22:29 UTC 1 0 0 531324 14980 408656 0 0 0 0 254 25 99 0 0 0 1 2014-11-01 04:22:30 UTC 1 0 0 531324 14988 408656 0 0 0 12 255 23 100 0 0 0 0 2014-11-01 04:22:31 UTC
さらに30分ほどCPUを使い続け、t2.microのCPU Credit Balanceを使い切ってみましょう。cpuのus(CPU USer)が20%程度に下がり、代わりにst(STeal)が高騰することが分かります。
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp--- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 0 527808 18580 408952 0 0 0 0 52 10 18 0 0 0 82 2014-11-01 05:07:03 UTC 1 0 0 527808 18580 408952 0 0 0 0 52 13 18 0 0 0 82 2014-11-01 05:07:04 UTC 1 0 0 527808 18588 408952 0 0 0 20 54 19 18 0 0 0 82 2014-11-01 05:07:05 UTC 2 0 0 527808 18588 408952 0 0 0 0 52 13 18 0 0 0 82 2014-11-01 05:07:06 UTC 2 0 0 527808 18588 408952 0 0 0 0 52 19 17 0 0 0 83 2014-11-01 05:07:07 UTC 1 0 0 527808 18588 408952 0 0 0 0 51 12 18 0 0 0 82 2014-11-01 05:07:08 UTC
CPU Creditを使いきってしまっているために、EC2(仮想OS)がCPUを要求しても仮想ホストがリソースを割り当てていないこと(stealがあがる)が読み取れます。
まとめ
stressツールを使うことで、高負荷時のサーバーの状態を簡単に再現することができます。重要なシステムについては、様々な高負荷状態でアプリケーションを実行し挙動を確認しておく良いでしょう。特に例で示したように、思いがけずCPU Creditを使い切ってしまった場合にどのような挙動をするのか把握しておくこと(サービス停止やデータ不整合が起きないこと)が重要だと思います。ぜひご活用ください。